/**
 * 交叉类型：&
 * 即 A & B，需要同时满足 A 与 B 两个类型才行
*/

//1、对于对象类型的合并，需要同时符合这两个对象的结构
interface NameStruct {
    name: string;
}
interface AgeStruct {
    age: number;
}
type ProfileStruct = NameStruct & AgeStruct;
const profile: ProfileStruct = {
    name: "hanxuming",
    age: 18
}

//2、对于原始类型，
type StrAndNum = string & number; // never：描述根本不存在的类型

//3、两个联合类型组成的交叉类型
type UnionIntersection1 = (1 | 2 | 3) & (1 | 2); // 1 | 2
type UnionIntersection2 = (string | number | symbol) & string; // string

//4、对于对象类型的交叉类型，其内部的 同名属性类型 同样会按照 交叉类型 进行合并
type Struct1 = {
    primitiveProp: string;
    objectProp: {
        name: string;
    }
}
type Struct2 = {
    primitiveProp: number;
    objectProp: {
        age: number;
    }
}
type Composed = Struct1 & Struct2;
type PrimitivePropType = Composed['primitiveProp']; // never
type ObjectPropType = Composed['objectProp']; // { name: string; age: number; }

//5、需要注意的是，如果 交叉类型 的其中一个成员是 any，那 交叉类型短板效应 就失效了，此时最终类型是 any 。
type Tmp4 = 1 & any; // any

//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }